home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 98 / Skunkware 98.iso / src / interp / perl5.005.tar.gz / perl5.005.tar / perl5.005 / op.h < prev    next >
C/C++ Source or Header  |  1998-07-19  |  9KB  |  323 lines

  1. /*    op.h
  2.  *
  3.  *    Copyright (c) 1991-1997, Larry Wall
  4.  *
  5.  *    You may distribute under the terms of either the GNU General Public
  6.  *    License or the Artistic License, as specified in the README file.
  7.  *
  8.  */
  9.  
  10. /*
  11.  * The fields of BASEOP are:
  12.  *    op_next        Pointer to next ppcode to execute after this one.
  13.  *            (Top level pre-grafted op points to first op,
  14.  *            but this is replaced when op is grafted in, when
  15.  *            this op will point to the real next op, and the new
  16.  *            parent takes over role of remembering starting op.)
  17.  *    op_ppaddr    Pointer to current ppcode's function.
  18.  *    op_type        The type of the operation.
  19.  *    op_flags    Flags common to all operations.  See OPf_* below.
  20.  *    op_private    Flags peculiar to a particular operation (BUT,
  21.  *            by default, set to the number of children until
  22.  *            the operation is privatized by a check routine,
  23.  *            which may or may not check number of children).
  24.  */
  25.  
  26. typedef U32 PADOFFSET;
  27. #define NOT_IN_PAD ((PADOFFSET) -1)
  28.  
  29. #ifdef DEBUGGING_OPS
  30. #define OPCODE opcode
  31. #else
  32. #define OPCODE U16
  33. #endif
  34.  
  35. #ifdef BASEOP_DEFINITION
  36. #define BASEOP BASEOP_DEFINITION
  37. #else
  38. #define BASEOP                \
  39.     OP*        op_next;        \
  40.     OP*        op_sibling;        \
  41.     OP*        (CPERLscope(*op_ppaddr))_((ARGSproto));        \
  42.     PADOFFSET    op_targ;        \
  43.     OPCODE    op_type;        \
  44.     U16        op_seq;            \
  45.     U8        op_flags;        \
  46.     U8        op_private;
  47. #endif
  48.  
  49. #define OP_GIMME(op,dfl) \
  50.     (((op)->op_flags & OPf_WANT) == OPf_WANT_VOID   ? G_VOID   : \
  51.      ((op)->op_flags & OPf_WANT) == OPf_WANT_SCALAR ? G_SCALAR : \
  52.      ((op)->op_flags & OPf_WANT) == OPf_WANT_LIST   ? G_ARRAY   : \
  53.      dfl)
  54.  
  55. #define GIMME_V        OP_GIMME(PL_op, block_gimme())
  56.  
  57. /* Public flags */
  58.  
  59. #define OPf_WANT    3    /* Mask for "want" bits: */
  60. #define  OPf_WANT_VOID     1    /*   Want nothing */
  61. #define  OPf_WANT_SCALAR 2    /*   Want single value */
  62. #define  OPf_WANT_LIST     3    /*   Want list of any length */
  63. #define OPf_KIDS    4    /* There is a firstborn child. */
  64. #define OPf_PARENS    8    /* This operator was parenthesized. */
  65.                 /*  (Or block needs explicit scope entry.) */
  66. #define OPf_REF        16    /* Certified reference. */
  67.                 /*  (Return container, not containee). */
  68. #define OPf_MOD        32    /* Will modify (lvalue). */
  69. #define OPf_STACKED    64    /* Some arg is arriving on the stack. */
  70. #define OPf_SPECIAL    128    /* Do something weird for this op: */
  71.                 /*  On local LVAL, don't init local value. */
  72.                 /*  On OP_SORT, subroutine is inlined. */
  73.                 /*  On OP_NOT, inversion was implicit. */
  74.                 /*  On OP_LEAVE, don't restore curpm. */
  75.                 /*  On truncate, we truncate filehandle */
  76.                 /*  On control verbs, we saw no label */
  77.                 /*  On flipflop, we saw ... instead of .. */
  78.                 /*  On UNOPs, saw bare parens, e.g. eof(). */
  79.                 /*  On OP_ENTERSUB || OP_NULL, saw a "do". */
  80.                 /*  On OP_(ENTER|LEAVE)EVAL, don't clear $@ */
  81.                 /*  On OP_ENTERITER, loop var is per-thread */
  82.  
  83. /* old names; don't use in new code, but don't break them, either */
  84. #define OPf_LIST    OPf_WANT_LIST
  85. #define OPf_KNOW    OPf_WANT
  86. #define GIMME \
  87.       (PL_op->op_flags & OPf_WANT                    \
  88.        ? ((PL_op->op_flags & OPf_WANT) == OPf_WANT_LIST        \
  89.           ? G_ARRAY                            \
  90.           : G_SCALAR)                        \
  91.        : dowantarray())
  92.  
  93. /* Private for lvalues */
  94. #define OPpLVAL_INTRO    128    /* Lvalue must be localized */
  95.  
  96. /* Private for OP_AASSIGN */
  97. #define OPpASSIGN_COMMON    64    /* Left & right have syms in common. */
  98.  
  99. /* Private for OP_SASSIGN */
  100. #define OPpASSIGN_BACKWARDS    64    /* Left & right switched. */
  101.  
  102. /* Private for OP_MATCH and OP_SUBST{,CONST} */
  103. #define OPpRUNTIME        64    /* Pattern coming in on the stack */
  104.  
  105. /* Private for OP_TRANS */
  106. #define OPpTRANS_COUNTONLY    8
  107. #define OPpTRANS_SQUASH        16
  108. #define OPpTRANS_DELETE        32
  109. #define OPpTRANS_COMPLEMENT    64
  110.  
  111. /* Private for OP_REPEAT */
  112. #define OPpREPEAT_DOLIST    64    /* List replication. */
  113.  
  114. /* Private for OP_ENTERSUB, OP_RV2?V, OP_?ELEM */
  115. #define OPpDEREF        (32|64)    /* Want ref to something: */
  116. #define OPpDEREF_AV        32    /*   Want ref to AV. */
  117. #define OPpDEREF_HV        64    /*   Want ref to HV. */
  118. #define OPpDEREF_SV        (32|64)    /*   Want ref to SV. */
  119.   /* OP_ENTERSUB only */
  120. #define OPpENTERSUB_DB        16    /* Debug subroutine. */
  121. #define OPpENTERSUB_AMPER    8    /* Used & form to call. */
  122.   /* OP_?ELEM only */
  123. #define OPpLVAL_DEFER        16    /* Defer creation of array/hash elem */
  124.   /* for OP_RV2?V, lower bits carry hints */
  125.  
  126. /* Private for OP_CONST */
  127. #define OPpCONST_ENTERED    16    /* Has been entered as symbol. */
  128. #define OPpCONST_ARYBASE    32    /* Was a $[ translated to constant. */
  129. #define OPpCONST_BARE        64    /* Was a bare word (filehandle?). */
  130.  
  131. /* Private for OP_FLIP/FLOP */
  132. #define OPpFLIP_LINENUM        64    /* Range arg potentially a line num. */
  133.  
  134. /* Private for OP_LIST */
  135. #define OPpLIST_GUESSED        64    /* Guessed that pushmark was needed. */
  136.  
  137. /* Private for OP_DELETE */
  138. #define OPpSLICE        64    /* Operating on a list of keys */
  139.  
  140. /* Private for OP_SORT, OP_PRTF, OP_SPRINTF, string cmp'n, and case changers */
  141. #define OPpLOCALE        64    /* Use locale */
  142.  
  143. /* Private for OP_THREADSV */
  144. #define OPpDONE_SVREF        64    /* Been through newSVREF once */
  145.  
  146. struct op {
  147.     BASEOP
  148. };
  149.  
  150. struct unop {
  151.     BASEOP
  152.     OP *    op_first;
  153. };
  154.  
  155. struct binop {
  156.     BASEOP
  157.     OP *    op_first;
  158.     OP *    op_last;
  159. };
  160.  
  161. struct logop {
  162.     BASEOP
  163.     OP *    op_first;
  164.     OP *    op_other;
  165. };
  166.  
  167. struct condop {
  168.     BASEOP
  169.     OP *    op_first;
  170.     OP *    op_true;
  171.     OP *    op_false;
  172. };
  173.  
  174. struct listop {
  175.     BASEOP
  176.     OP *    op_first;
  177.     OP *    op_last;
  178.     U32        op_children;
  179. };
  180.  
  181. struct pmop {
  182.     BASEOP
  183.     OP *    op_first;
  184.     OP *    op_last;
  185.     U32        op_children;
  186.     OP *    op_pmreplroot;
  187.     OP *    op_pmreplstart;
  188.     PMOP *    op_pmnext;        /* list of all scanpats */
  189.     REGEXP *    op_pmregexp;        /* compiled expression */
  190.     U16        op_pmflags;
  191.     U16        op_pmpermflags;
  192.     U8        op_pmdynflags;
  193. };
  194.  
  195. #define PMdf_USED    0x01        /* pm has been used once already */
  196. #define PMdf_TAINTED    0x02        /* pm compiled from tainted pattern */
  197.  
  198. #define PMf_RETAINT    0x0001        /* taint $1 etc. if target tainted */
  199. #define PMf_ONCE    0x0002        /* use pattern only once per reset */
  200. #define PMf_REVERSED    0x0004        /* Should be matched right->left */
  201. #define PMf_MAYBE_CONST    0x0008        /* replacement contains variables */
  202. #define PMf_SKIPWHITE    0x0010        /* skip leading whitespace for split */
  203. #define PMf_WHITE    0x0020        /* pattern is \s+ */
  204. #define PMf_CONST    0x0040        /* subst replacement is constant */
  205. #define PMf_KEEP    0x0080        /* keep 1st runtime pattern forever */
  206. #define PMf_GLOBAL    0x0100        /* pattern had a g modifier */
  207. #define PMf_CONTINUE    0x0200        /* don't reset pos() if //g fails */
  208. #define PMf_EVAL    0x0400        /* evaluating replacement as expr */
  209. #define PMf_LOCALE    0x0800        /* use locale for character types */
  210. #define PMf_MULTILINE    0x1000        /* assume multiple lines */
  211. #define PMf_SINGLELINE    0x2000        /* assume single line */
  212. #define PMf_FOLD    0x4000        /* case insensitivity */
  213. #define PMf_EXTENDED    0x8000        /* chuck embedded whitespace */
  214.  
  215. /* mask of bits stored in regexp->reganch */
  216. #define PMf_COMPILETIME    (PMf_MULTILINE|PMf_SINGLELINE|PMf_LOCALE|PMf_FOLD|PMf_EXTENDED)
  217.  
  218. struct svop {
  219.     BASEOP
  220.     SV *    op_sv;
  221. };
  222.  
  223. struct gvop {
  224.     BASEOP
  225.     GV *    op_gv;
  226. };
  227.  
  228. struct pvop {
  229.     BASEOP
  230.     char *    op_pv;
  231. };
  232.  
  233. struct loop {
  234.     BASEOP
  235.     OP *    op_first;
  236.     OP *    op_last;
  237.     U32        op_children;
  238.     OP *    op_redoop;
  239.     OP *    op_nextop;
  240.     OP *    op_lastop;
  241. };
  242.  
  243. #define cUNOP ((UNOP*)PL_op)
  244. #define cBINOP ((BINOP*)PL_op)
  245. #define cLISTOP ((LISTOP*)PL_op)
  246. #define cLOGOP ((LOGOP*)PL_op)
  247. #define cCONDOP ((CONDOP*)PL_op)
  248. #define cPMOP ((PMOP*)PL_op)
  249. #define cSVOP ((SVOP*)PL_op)
  250. #define cGVOP ((GVOP*)PL_op)
  251. #define cPVOP ((PVOP*)PL_op)
  252. #define cCOP ((COP*)PL_op)
  253. #define cLOOP ((LOOP*)PL_op)
  254.  
  255. #define cUNOPo ((UNOP*)o)
  256. #define cBINOPo ((BINOP*)o)
  257. #define cLISTOPo ((LISTOP*)o)
  258. #define cLOGOPo ((LOGOP*)o)
  259. #define cCONDOPo ((CONDOP*)o)
  260. #define cPMOPo ((PMOP*)o)
  261. #define cSVOPo ((SVOP*)o)
  262. #define cGVOPo ((GVOP*)o)
  263. #define cPVOPo ((PVOP*)o)
  264. #define cCVOPo ((CVOP*)o)
  265. #define cCOPo ((COP*)o)
  266. #define cLOOPo ((LOOP*)o)
  267.  
  268. #define kUNOP ((UNOP*)kid)
  269. #define kBINOP ((BINOP*)kid)
  270. #define kLISTOP ((LISTOP*)kid)
  271. #define kLOGOP ((LOGOP*)kid)
  272. #define kCONDOP ((CONDOP*)kid)
  273. #define kPMOP ((PMOP*)kid)
  274. #define kSVOP ((SVOP*)kid)
  275. #define kGVOP ((GVOP*)kid)
  276. #define kPVOP ((PVOP*)kid)
  277. #define kCOP ((COP*)kid)
  278. #define kLOOP ((LOOP*)kid)
  279.  
  280. #define Nullop Null(OP*)
  281.  
  282. /* Lowest byte of opargs */
  283. #define OA_MARK 1
  284. #define OA_FOLDCONST 2
  285. #define OA_RETSCALAR 4
  286. #define OA_TARGET 8
  287. #define OA_RETINTEGER 16
  288. #define OA_OTHERINT 32
  289. #define OA_DANGEROUS 64
  290. #define OA_DEFGV 128
  291.  
  292. /* The next 4 bits encode op class information */
  293. #define OA_CLASS_MASK (15 << 8)
  294.  
  295. #define OA_BASEOP (0 << 8)
  296. #define OA_UNOP (1 << 8)
  297. #define OA_BINOP (2 << 8)
  298. #define OA_LOGOP (3 << 8)
  299. #define OA_CONDOP (4 << 8)
  300. #define OA_LISTOP (5 << 8)
  301. #define OA_PMOP (6 << 8)
  302. #define OA_SVOP (7 << 8)
  303. #define OA_GVOP (8 << 8)
  304. #define OA_PVOP (9 << 8)
  305. #define OA_LOOP (10 << 8)
  306. #define OA_COP (11 << 8)
  307. #define OA_BASEOP_OR_UNOP (12 << 8)
  308. #define OA_FILESTATOP (13 << 8)
  309. #define OA_LOOPEXOP (14 << 8)
  310.  
  311. #define OASHIFT 12
  312.  
  313. /* Remaining nybbles of opargs */
  314. #define OA_SCALAR 1
  315. #define OA_LIST 2
  316. #define OA_AVREF 3
  317. #define OA_HVREF 4
  318. #define OA_CVREF 5
  319. #define OA_FILEREF 6
  320. #define OA_SCALARREF 7
  321. #define OA_OPTIONAL 8
  322.  
  323.